/**
 * A pálya egyetlen mezőjét reprezentáló objektum. Bármilyen, az Entity
 * absztrakt osztályból származó pályaelemet tartalmazhat. Négy irányba
 * (fel, le, jobbra, balra) levő szomszédaira mutató referenciákat ismeri.
 */
public class Field
{
  /**
   * A mező szomszédait négy irányban tárolja.
   * (Indexek: 1: bal fel, 2: fel, 3: jobb fel, 4:jobb le, 5: le, 6: bal le)
   */
  private Field _neighbours[] = new Field[7];

  /**
   * A Field példányt létrehozó Game osztály példány referenciája.
   */
  private Game _game;

  /**
   * A mező által tartalmazott Entity referenciája.
   */
  private Entity _entity = null;

  /**
   * Nem része a játéknak, csak a sok példányos objektumok logban való könnyebb
   * azonosítására szolgál.
   */
 // public int ID = SkeletonHelper.GetObjectID();
  
  /**
   * A konstruktorban megkapja az őt létrehozó Game osztály példány 
   * referenciáját, hogy később tudjon rá hivatkozni.
   * @param game A Game osztály referenciája.
   */
  public Field(Game game)
  {
    _game = game;
    for(int i = 1;i<7;i++)
    {
      _neighbours[i] = null;
    }
  }

  /**
   * A mező ürességének ellenőrzése.
   * @return Ha a mező üres true, ha nem akkor false
   */
  public boolean isEmpty()
  {
    return _entity == null;
  }

  /**
   * A Field tartalmát jelképező Entity referenciát null-ra állítja.
   */
  public void delete()
  {
    _entity = null;
  }

  /**
   * A megadott Entityt elhelyezi a mezőben.
   * @param param A Fieldbe helyezendő Entity referenciája.
   */
  public void add(Entity param)
  {
    _entity = param;
    param.setField(this);
  }

  /**
   * Visszaadja a mező egy adott irányban található szomszédját.
   * @param direction Az irány, hogy melyik szomszédot várjuk.
   * @return Az adott irányban található szomszéd referenciája.
   */
  public Field getNeighbour(int direction) throws NullPointerException
  {
    if(_neighbours[direction] != null)
    {
      return _neighbours[direction];
    }
    else
    {
      throw new NullPointerException();
    }
  }

  /**
   * Beállítja a mező egy szomszédját egy adott irányba.
   * @param direction A beállítandó szomszéd relatív helyzete (0 -> fel,
   * 1-> jobb, 2-> le, 3-> bal)
   * @param neighbour A beállytandó szomszéd referenciája.
   */
  public void setNeighbour(int direction, Field neighbour)
  {    
    _neighbours[direction] = neighbour;
  }

  /**
   * Visszaadja a game osztály példányát.
   * @return
   */
  public Game getGame()
  {
    return _game;
  }

  /**
   * Visszaadja azon Entity referenciáját, amit a mező tartalmaz.
   * @return A tartalamzott Entity referenciája.
   */
  public Entity getEntity()
  {
    return _entity;
  }
}